home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-PPC / ATOMIC.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  2KB  |  122 lines

  1. /*
  2.  * PowerPC atomic operations
  3.  */
  4.  
  5. #ifndef _ASM_PPC_ATOMIC_H_ 
  6. #define _ASM_PPC_ATOMIC_H_
  7.  
  8. #ifdef __SMP__
  9. typedef struct { volatile int counter; } atomic_t;
  10. #else
  11. typedef struct { int counter; } atomic_t;
  12. #endif
  13.  
  14. #define ATOMIC_INIT(i)    { (i) }
  15.  
  16. #define atomic_read(v)        ((v)->counter)
  17. #define atomic_set(v,i)        (((v)->counter) = (i))
  18.  
  19. extern void atomic_add(int a, atomic_t *v);
  20. extern int  atomic_add_return(int a, atomic_t *v);
  21. extern void atomic_sub(int a, atomic_t *v);
  22. extern void atomic_inc(atomic_t *v);
  23. extern int  atomic_inc_return(atomic_t *v);
  24. extern void atomic_dec(atomic_t *v);
  25. extern int  atomic_dec_return(atomic_t *v);
  26. extern int  atomic_dec_and_test(atomic_t *v);
  27.  
  28. extern void atomic_clear_mask(unsigned long mask, unsigned long *addr);
  29. extern void atomic_set_mask(unsigned long mask, unsigned long *addr);
  30.  
  31. #if 0    /* for now */
  32. extern __inline__ void atomic_add(atomic_t a, atomic_t *v)
  33. {
  34.     atomic_t t;
  35.  
  36.     __asm__ __volatile__("\n\
  37. 1:    lwarx    %0,0,%3\n\
  38.     add    %0,%2,%0\n\
  39.     stwcx.    %0,0,%3\n\
  40.     bne    1b"
  41.     : "=&r" (t), "=m" (*v)
  42.     : "r" (a), "r" (v)
  43.     : "cc");
  44. }
  45.  
  46. extern __inline__ void atomic_sub(atomic_t a, atomic_t *v)
  47. {
  48.     atomic_t t;
  49.  
  50.     __asm__ __volatile__("\n\
  51. 1:    lwarx    %0,0,%3\n\
  52.     subf    %0,%2,%0\n\
  53.     stwcx.    %0,0,%3\n\
  54.     bne    1b"
  55.     : "=&r" (t), "=m" (*v)
  56.     : "r" (a), "r" (v)
  57.     : "cc");
  58. }
  59.  
  60. extern __inline__ int atomic_sub_and_test(atomic_t a, atomic_t *v)
  61. {
  62.     atomic_t t;
  63.  
  64.     __asm__ __volatile__("\n\
  65. 1:    lwarx    %0,0,%3\n\
  66.     subf    %0,%2,%0\n\
  67.     stwcx.    %0,0,%3\n\
  68.     bne    1b"
  69.     : "=&r" (t), "=m" (*v)
  70.     : "r" (a), "r" (v)
  71.     : "cc");
  72.  
  73.     return t == 0;
  74. }
  75.  
  76. extern __inline__ void atomic_inc(atomic_t *v)
  77. {
  78.     atomic_t t;
  79.  
  80.     __asm__ __volatile__("\n\
  81. 1:    lwarx    %0,0,%2\n\
  82.     addic    %0,%0,1\n\
  83.     stwcx.    %0,0,%2\n\
  84.     bne    1b"
  85.     : "=&r" (t), "=m" (*v)
  86.     : "r" (v)
  87.     : "cc");
  88. }
  89.  
  90. extern __inline__ void atomic_dec(atomic_t *v)
  91. {
  92.     atomic_t t;
  93.  
  94.     __asm__ __volatile__("\n\
  95. 1:    lwarx    %0,0,%2\n\
  96.     addic    %0,%0,-1\n\
  97.     stwcx.    %0,0,%2\n\
  98.     bne    1b"
  99.     : "=&r" (t), "=m" (*v)
  100.     : "r" (v)
  101.     : "cc");
  102. }
  103.  
  104. extern __inline__ int atomic_dec_and_test(atomic_t *v)
  105. {
  106.     atomic_t t;
  107.  
  108.     __asm__ __volatile__("\n\
  109. 1:    lwarx    %0,0,%2\n\
  110.     addic    %0,%0,-1\n\
  111.     stwcx.    %0,0,%2\n\
  112.     bne    1b"
  113.     : "=&r" (t), "=m" (*v)
  114.     : "r" (v)
  115.     : "cc");
  116.  
  117.     return t == 0;
  118. }
  119. #endif /* 0 */
  120.  
  121. #endif /* _ASM_PPC_ATOMIC_H_ */
  122.